package br.com.jk.cont.planocontas;

import java.io.Serializable;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import org.hibernate.annotations.Index;

/**
 * @author camilo
 */
@Entity
@Table(name = PlanoContasDao.NAME_TABLE, schema = PlanoContasDao.NAME_SCHEMA, uniqueConstraints = {
  @UniqueConstraint(name = PlanoContasDao.NAME_UK_PLANO_CONTAS_COD, columnNames = PlanoContasDao.NAME_COLUMN_COD)})
public class PlanoContas implements Serializable {

  public static final String ATTRIBUTE_ID = "id";
  public static final String ATTRIBUTE_COD = "cod";
  public static final String ATTRIBUTE_CODPAI = "codPai";
  public static final String ATTRIBUTE_NIVEL = "nivel";
  public static final String ATTRIBUTE_DESCRICAO = "descricao";
  public static final String ATTRIBUTE_OBSERVACAO = "observacao";
  public static final String ATTRIBUTE_NATUREZA = "natureza";
  public static final String ATTRIBUTE_TITULO = "titulo";
  public static final String ATTRIBUTE_CONTABANCO = "contaBanco";
  private static final long serialVersionUID = 1L;
  @Id
  @SequenceGenerator(name = PlanoContasDao.NAME_SEQUENCE, sequenceName = PlanoContasDao.NAME_SEQUENCE)
  @GeneratedValue(strategy = GenerationType.AUTO, generator = PlanoContasDao.NAME_SEQUENCE)
  @Index(name = PlanoContasDao.NAME_INDEX_ID, columnNames = PlanoContasDao.NAME_COLUMN_ID)
  private Integer id;
  @NotNull(message = "Deve ser informado o código da conta.")
  @Column(name = PlanoContasDao.NAME_COLUMN_COD)
  private String cod;
  @Column(name = PlanoContasDao.NAME_COLUMN_COD_PAI)
  private String codPai;
  @Min(0)
  @Max(5)
  @Column(name = PlanoContasDao.NAME_COLUMN_NIVEL, length = 1)
  private Integer nivel;
  @Column(name = PlanoContasDao.NAME_COLUMN_DESCRICAO)
  @NotNull(message = "Deve ser informada uma descrição {planocontas.descricao}")
  private String descricao;
  @Column(name = PlanoContasDao.NAME_COLUMN_OBSERVACAO)
  private String observacao;
  @Column(name = PlanoContasDao.NAME_COLUMN_NATUREZA, length = 1)
  private String natureza;
  @Column(name = PlanoContasDao.NAME_COLUMN_TITULO)
  private Boolean titulo;
  @Column(name = PlanoContasDao.NAME_COLUMN_CONTABANCO)
  private Boolean contaBanco;

  public Boolean isContaBanco() {
    return contaBanco;
  }

  public void setContaBanco(Boolean contaBanco) {
    this.contaBanco = contaBanco;
  }

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public Boolean isTitulo() {
    return titulo;
  }

  public void setTitulo(Boolean titulo) {
    this.titulo = titulo;
  }

  public String getCod() {
    return cod;
  }

  public void setCod(String cod) {
    this.cod = cod;
  }

  public String getCodPai() {
    return codPai;
  }

  public void setCodPai(String codPai) {
    this.codPai = codPai;
  }

  public Integer getNivel() {
    return nivel;
  }

  public void setNivel(Integer nivel) {
    this.nivel = nivel;
  }

  public String getDescricao() {
    return descricao;
  }

  public void setDescricao(String descricao) {
    this.descricao = descricao;
  }

  public String getObservacao() {
    return observacao;
  }

  public void setObservacao(String observacao) {
    this.observacao = observacao;
  }

  public String getNatureza() {
    return natureza;
  }

  public void setNatureza(String natureza) {
    this.natureza = natureza;
  }

  @Override
  public int hashCode() {
    int hash = 3;
    hash = 79 * hash + Objects.hashCode(this.id);
    hash = 79 * hash + Objects.hashCode(this.cod);
    hash = 79 * hash + Objects.hashCode(this.codPai);
    hash = 79 * hash + Objects.hashCode(this.nivel);
    hash = 79 * hash + Objects.hashCode(this.descricao);
    hash = 79 * hash + Objects.hashCode(this.observacao);
    hash = 79 * hash + Objects.hashCode(this.natureza);
    hash = 79 * hash + Objects.hashCode(this.titulo);
    hash = 79 * hash + Objects.hashCode(this.contaBanco);
    return hash;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    final PlanoContas other = (PlanoContas) obj;
    if (!Objects.equals(this.id, other.id)) {
      return false;
    }
    if (!Objects.equals(this.cod, other.cod)) {
      return false;
    }
    if (!Objects.equals(this.codPai, other.codPai)) {
      return false;
    }
    if (!Objects.equals(this.nivel, other.nivel)) {
      return false;
    }
    if (!Objects.equals(this.descricao, other.descricao)) {
      return false;
    }
    if (!Objects.equals(this.observacao, other.observacao)) {
      return false;
    }
    if (!Objects.equals(this.natureza, other.natureza)) {
      return false;
    }
    if (!Objects.equals(this.titulo, other.titulo)) {
      return false;
    }
    return Objects.equals(this.contaBanco, other.contaBanco);
  }

}
